package cn.tedu.st.security.pojo.vo;

import cn.tedu.st.security.pojo.entity.User;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.GrantedAuthority;

import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * 实现 UserDetails 接口的用户详情类。
 * 如果找到了这个用户，数据库会返回一个叫 UserDetails 的对象。
 * 这个对象包含了用户的详细信息，比如用户名、加密后的密码、用户的角色（权限）等。
 */
@Component
@Data
@NoArgsConstructor
@Slf4j
public class UserDetailsImpl implements UserDetails {
    private List<String> list;
    private User user;
/**  通过构造器注入User
    因为从数据库中返回的类型为User类型
    要把User属性映射到UserDetail的属性中
    UserDetailsServiceImpl的loadUserByUsername的返回类型为UserDetails，其中参数就是数据库查到的User
 */
    public UserDetailsImpl(User user,List<String> list) {
        log.debug("UserDetailsImpl中通过构造器注入User");
        this.user = user;
        this.list = list;
    }

    /**
     * 返回用户所拥有的角色（权限）集合。
     * 每个 GrantedAuthority 对象表示一个权限或角色。
     *
     * @return 用户的角色（权限）集合
     */
    //自定义授权集合
            @JSONField(serialize = false)
    List<SimpleGrantedAuthority> authorities=new ArrayList<>();
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        // TODO: 实现获取用户角色的方法

        // 如果 authorities 已经被填充，则直接返回
        if (!authorities.isEmpty()) {
            return authorities;
        }

        // 如果 list 为空或为 null，则返回空的权限集合
        if (list == null || list.isEmpty()) {
            log.warn("用户角色列表为空");
            return authorities;
        }

        // 遍历 list 并填充 authorities
        for (String role : list) {
            authorities.add(new SimpleGrantedAuthority(role));
        }

        log.debug("权限集合：authorities={}", authorities);
        return authorities;
    }


    /**
     * 返回用户的加密后密码。
     *
     * @return 用户的加密后密码
     */
    @Override
    public String getPassword() {
        // TODO: 实现获取用户密码的方法
        return user.getPassword();
    }

    /**
     * 返回用户的用户名。
     *
     * @return 用户名
     */
    @Override
    public String getUsername() {
        // TODO: 实现获取用户名的方法
        return user.getUsername();
    }

    /**
     * 判断用户的账户是否未过期。
     *
     * @return true 表示账户未过期，false 表示已过期
     */
    @Override
    public boolean isAccountNonExpired() {
        // 默认返回 true，表示账户未过期
        return user.getAccountNonExpired()==1;
    }

    /**
     * 判断用户的账户是否未锁定。
     *
     * @return true 表示账户未锁定，false 表示已锁定
     */
    @Override
    public boolean isAccountNonLocked() {
        // 默认返回 true，表示账户未锁定
        return user.getAccountNonLocked()==1;
    }

    /**
     * 判断用户的凭证（如密码）是否未过期。
     *
     * @return true 表示凭证未过期，false 表示已过期
     */
    @Override
    public boolean isCredentialsNonExpired() {
        // 默认返回 true，表示凭证未过期
        return user.getCredentialsNonExpired()==1;
    }

    /**
     * 判断用户是否启用。
     *
     * @return true 表示用户已启用，false 表示未启用
     */
    @Override
    public boolean isEnabled() {
        // 默认返回 true，表示用户已启用
        return user.getStatus()==1;
    }
}
